package com.fcgzs.seckill.timer;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fcgzs.seckill.dao.SeckillGoodsMapper;
import com.fcgzs.seckill.pojo.SeckillGoods;
import com.fcgzs.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Auther: ljj
 * @Description:    定时同步任务
 */
@Component
public class SeckillGoodsPushTask {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private SeckillGoodsMapper seckillGoodsMapper;

    /**
     *
     * 每天上午10点，下午2点，4点   0 0 10,14,16 * * ?
     *
     * 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发     0 0/5 14,18 * * ?
     *
     * 每月的最后一个星期五上午10:15触发       0 15 10 ? * 6L
     *
     * cron
     * 第一位  秒 （0-59）   * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围
     * 第二位  分  （0-59）  * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围
     * 第三位  小时 （0-23）  * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围
     * 第四位  天  （1-31）  * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围  ？占位符
     * 第五位  月   （1-12） * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围
     * 第六位  星期  （1-7）  * 通配符（每秒）   , 指定多个值   / 间隔步长   - 范围  ？占位符
     *
     */
    //要求每30秒同步一次缓存数据
    @Scheduled(cron = "0/30 * * * * ?") //定时任务注解
    public void loadGoodsToRedis(){
        List<Date> dateMenus = DateUtil.getDateMenus();

        for (Date startDate : dateMenus) {

            String date2Str = DateUtil.date2Str(startDate);

            QueryWrapper<SeckillGoods> queryWrapper = new QueryWrapper<>();

            //1.审核状态通过
            queryWrapper.eq("status","1");
            //2.库存数量大于0
            queryWrapper.gt("stock_count",0);
            //3.活动时间范围
            // 活动时间大于开始时间
            queryWrapper.gt("start_time",DateUtil.date2StrFull(startDate));

            //活动时间加2小时  小于结束时间
            queryWrapper.lt("end_time",DateUtil.date2StrFull(DateUtil.addDateHour(startDate,2)));

            //4.查询缓存中没有的商品
            //查询缓存中key值    seckillGoods_yyyyMMddHH
            Set keys = redisTemplate.boundHashOps("seckillGoods_" + date2Str).keys();
            //查询到的id过滤
            if (!CollectionUtils.isEmpty(keys)) {
                queryWrapper.notIn("id",keys);
            }


            //执行查询
            List<SeckillGoods> seckillGoodsList = seckillGoodsMapper.selectList(queryWrapper);

            //同步缓存
            if (!CollectionUtils.isEmpty(seckillGoodsList)) {
                for (SeckillGoods seckillGoods : seckillGoodsList) {
                    redisTemplate.boundHashOps("seckillGoods_"+date2Str).put(seckillGoods.getId(),seckillGoods);

                    //设置过期时间
                    //redisTemplate.expire("seckillGoods_"+date2Str,2, TimeUnit.HOURS);
                }
            }
        }



    }
}
